package com.example.work.utils;

import com.example.work.Excel.AssetEntity;
import com.example.work.entiy.DivisionAssetInfo;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;

public class UniversalSqlGenerator {
    // 时间格式化器
    private static final DateTimeFormatter DATE_TIME_FORMATTER =
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 生成任意表的INSERT SQL语句
     *
     * @param tableName   表名
     * @param fieldValues 包含字段名和对应值的Map
     * @return 完整的INSERT SQL语句
     */
    public static String generateInsertSql(String tableName, Map<String, Object> fieldValues) {
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }
        if (fieldValues == null || fieldValues.isEmpty()) {
            throw new IllegalArgumentException("Field values map cannot be null or empty");
        }

        StringBuilder columns = new StringBuilder();
        StringBuilder values = new StringBuilder();
        boolean first = true;

        for (Map.Entry<String, Object> entry : fieldValues.entrySet()) {
            if (!first) {
                columns.append(", ");
                values.append(", ");
            }
            first = false;

            columns.append(entry.getKey());

            Object value = entry.getValue();
            if (value == null) {
                values.append("NULL");
            } else if (value instanceof String) {
                // 转义单引号并添加引号
                values.append("'").append(((String) value).replace("'", "''")).append("'");
            } else if (value instanceof LocalDateTime) {
                // 格式化LocalDateTime为字符串并添加引号
                values.append("'").append(((LocalDateTime) value).format(DATE_TIME_FORMATTER)).append("'");
            } else if (value instanceof Boolean) {
                // 布尔值转换为0/1
                values.append(((Boolean) value) ? "1" : "0");
            } else {
                // 其他类型直接转换为字符串
                values.append(value.toString());
            }
        }

        return String.format("INSERT INTO %s (%s) VALUES (%s);",
                tableName, columns.toString(), values.toString());
    }

    /**
     * 生成任意表的UPDATE SQL语句
     *
     * @param tableName   表名
     * @param fieldValues 包含要更新的字段名和对应值的Map
     * @param condition   WHERE条件（不带WHERE关键字）
     * @return 完整的UPDATE SQL语句
     */
    public static String generateUpdateSql(String tableName, Map<String, Object> fieldValues, String condition) {
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }
        if (fieldValues == null || fieldValues.isEmpty()) {
            throw new IllegalArgumentException("Field values map cannot be null or empty");
        }
        if (condition == null || condition.trim().isEmpty()) {
            throw new IllegalArgumentException("Condition cannot be null or empty");
        }

        StringBuilder setClause = new StringBuilder();
        boolean first = true;

        for (Map.Entry<String, Object> entry : fieldValues.entrySet()) {
            if (!first) {
                setClause.append(", ");
            }
            first = false;

            setClause.append(entry.getKey()).append(" = ");

            Object value = entry.getValue();
            if (value == null) {
                setClause.append("NULL");
            } else if (value instanceof String) {
                // 转义单引号并添加引号
                setClause.append("'").append(((String) value).replace("'", "''")).append("'");
            } else if (value instanceof LocalDateTime) {
                // 格式化LocalDateTime为字符串并添加引号
                setClause.append("'").append(((LocalDateTime) value).format(DATE_TIME_FORMATTER)).append("'");
            } else if (value instanceof Boolean) {
                // 布尔值转换为0/1
                setClause.append(((Boolean) value) ? "1" : "0");
            } else {
                // 其他类型直接转换为字符串
                setClause.append(value.toString());
            }
        }

        return String.format("UPDATE %s SET %s WHERE %s;",
                tableName, setClause.toString(), condition);
    }

    /**
     * 生成任意表的DELETE SQL语句
     *
     * @param tableName 表名
     * @param condition WHERE条件（不带WHERE关键字）
     * @return 完整的DELETE SQL语句
     */
    public static String generateDeleteSql(String tableName, String condition) {
        if (tableName == null || tableName.trim().isEmpty()) {
            throw new IllegalArgumentException("Table name cannot be null or empty");
        }
        if (condition == null || condition.trim().isEmpty()) {
            throw new IllegalArgumentException("Condition cannot be null or empty");
        }

        return String.format("DELETE FROM %s WHERE %s;", tableName, condition);
    }

    // 便捷方法示例：针对division_asset_info表
    public static String generateDivisionAssetInsertSql(Map<String, Object> fieldValues) {
        return generateInsertSql("division_asset_info", fieldValues);
    }



    // 便捷方法示例：针对rank_log_asset_info_basis_web表
    public static String generateRankLogUpdateSql(String id, String assetId, String updateTime) {
        Map<String, Object> fieldValues = new HashMap<>();
        fieldValues.put("asset_id", assetId);
        fieldValues.put("update_time", updateTime);
        return generateUpdateSql("rank_log_asset_info_basis_web", fieldValues, "id = '" + id + "'");
    }


    /**
     * 将实体类字段映射到数据库列
     *
     * @param entity 实体类对象
     * @param port
     * @return 包含字段名和对应值的Map
     */
    public static String generateDivisionAssetIpPortInfoInsertSql(AssetEntity entity, String port) {
        Map<String, Object> fieldValues = new HashMap<>();

        // 主键ID（自增字段，插入时通常不设置）
        // fieldValues.put("id", entity.getId());

        // 集团资产ID
        fieldValues.put("group_asset_id", entity.getDivisionAssetId());

        // 部侧资产ID
        fieldValues.put("division_asset_id", entity.getDivisionAssetId());

        // 资产IP
        fieldValues.put("asset_ip", entity.getAssetIp());

        // 端口号
        fieldValues.put("port", port);

        // IP类型 (0-ipv4, 1-ipv6)
        fieldValues.put("ip_type", determineIpType(entity.getAssetIp()));

        // 是否可从互联网访问 (0-否，1-是)
        fieldValues.put("is_access", entity.getIsAccess());

        // 管理业务标识 (0-管理地址，1-业务地址)
//        fieldValues.put("manage_tag", entity.getManageTag());
        // 网络位置 (0-内网，1-外网)
        fieldValues.put("net_position", entity.getNetPosition());

        return generateInsertSql("division_asset_ip_port_info",fieldValues);
    }

    public static String generateRankLogAssetInfoBasisWebInsertSql(AssetEntity entity, ArrayList<String> unitType) {
        Map<String, Object> fieldValues = new HashMap<>();
        // 主键ID
        fieldValues.put("id", entity.getId());
        // 关联主键
        fieldValues.put("rela_id", entity.getRelaId());
        // 资产ID
        fieldValues.put("asset_id", entity.getDivisionAssetId());
        // 资产类型
        fieldValues.put("asset_type", entity.getDivAssetType());
        // 报送工信部资产类型
        fieldValues.put("report_asset_type", entity.getDivReportAssetType());
        // 资产状态
        fieldValues.put("so_state", entity.getStatus());
        // 是否采用开源框架
        fieldValues.put("open_source", entity.getDivOpenSource());
        // 组件名称
        fieldValues.put("component_name", null);
        // 开源组件版本
        fieldValues.put("component_name_version", null);
        // 是否可以从互联网访问
        fieldValues.put("is_access", entity.getIsAccess());
        // 管理业务标识
        fieldValues.put("ip_servce", entity.getIpServce());
        // 生产厂商
        fieldValues.put("manufacturer", entity.getDivManufacturer());
        // 品牌名称
        fieldValues.put("brand_name", entity.getDivBrandName());
        // 品牌区域
        fieldValues.put("brand_region", entity.getDivBrandRegion());
        // IP访问控制
        fieldValues.put("ip_access_control", entity.getIpAccessControl());




        if ("0699".equals(entity.getDivReportAssetType())){
            fieldValues.put("software_name", entity.getComponentName());
        }

        // url、数据库名称/数据库型号、中间名称/中间件型号、操作系统名称/操作系统型号
        if (unitType.contains(entity.getDivReportAssetType())){
            fieldValues.put("software_name", entity.getAssetModel());
        }else {
            fieldValues.put("hw_model", entity.getAssetModel());
        }

        if ("0701".equals(entity.getDivReportAssetType())){
            // 操作系统版本
            fieldValues.put("opera_system_version", entity.getAssetVersion());
        }else if (unitType.contains(entity.getDivReportAssetType())){
            // 数据库版本、中间件版本
            fieldValues.put("software_version", entity.getAssetVersion());
        }else {
            // web型号、其他软件型号
            fieldValues.put("hw_version", entity.getAssetModel());
        }

        // 资产发现方式
        fieldValues.put("found_type_earliest", entity.getFoundTypeEarliest());
        // 更新时间
        fieldValues.put("update_time", entity.getFoundTime());
        // 记录创建时间
        fieldValues.put("record_create_time", entity.getFoundTime());
        // 更新人姓名
        fieldValues.put("update_user_name", entity.getUpdateUserName());
        // 更新人ID
        fieldValues.put("update_user", entity.getUpdateUser());
        // 创建人名称
        fieldValues.put("create_user_name", entity.getCreateUserName());
        // 创建人ID
        fieldValues.put("create_user", entity.getCreateUser());
        // 创建时间
        fieldValues.put("create_time", entity.getFoundTime());
        // 资产是否已删除
        fieldValues.put("asset_deleted", "0");
        // IP访问控制备注
        fieldValues.put("ip_access_control_remark", entity.getIpAccessControlRemark());

        return generateInsertSql("rank_log_asset_info_basis_web",fieldValues);

    }



    /**
     * 生成完整字段INSERT SQL的示例方法
     * @param entity 包含所有字段值的DivisionAssetInfo对象
     * @return 完整的INSERT SQL语句
     */
    public static String generateDivisionAssetInfoInsertSql(AssetEntity entity) {
        Map<String, Object> fieldValues = new HashMap<>();

        // 添加所有字段到Map
        fieldValues.put("rela_id", entity.getRelaId());
        fieldValues.put("group_asset_id", entity.getDivisionAssetId());
        fieldValues.put("division_asset_id", entity.getDivisionAssetId());
        fieldValues.put("isp_code", entity.getIspCode());
        fieldValues.put("org_code", entity.getOrgCode());
        fieldValues.put("is_access", entity.getIsAccess());
        fieldValues.put("net_position", entity.getNetPosition());
        fieldValues.put("asset_name", entity.getAssetName());
        fieldValues.put("div_asset_type", entity.getDivAssetType());
        fieldValues.put("div_report_asset_type", entity.getDivReportAssetType());
        fieldValues.put("status", entity.getStatus());
        fieldValues.put("location", entity.getLocation());
        fieldValues.put("asset_tag", entity.getAssetTag());
        fieldValues.put("asset_model", entity.getAssetModel());
        fieldValues.put("asset_version", entity.getAssetVersion());
        fieldValues.put("manufacturer", entity.getDivManufacturer());
        fieldValues.put("brand_name", entity.getDivBrandName());
        fieldValues.put("brand_region", entity.getDivBrandRegion());
        fieldValues.put("cpu_manufacturer", entity.getCpuManufacturer());
        fieldValues.put("cpu_model", entity.getCpuModel());
        fieldValues.put("memory_manufacturer", entity.getMemoryManufacturer());
        fieldValues.put("memory_model", entity.getMemoryModel());
        fieldValues.put("chip_manufacturer", entity.getChipManufacturer());
        fieldValues.put("chip_model", entity.getChipModel());
        fieldValues.put("open_source", entity.getDivOpenSource());
//        fieldValues.put("open_source_model", entity.getOpenSourceModel());
//        fieldValues.put("open_source_verison", entity.getOpenSourceVerison());
        fieldValues.put("system_name", entity.getObjectName());
        fieldValues.put("obeject_name", entity.getObjectName());
        fieldValues.put("obeject_level", entity.getObjectLevel());
//        fieldValues.put("network_unit_type", entity.getNetworkUnitType());
        fieldValues.put("found_type", entity.getFoundType());
        fieldValues.put("found_time", entity.getFoundTime());
//        fieldValues.put("virtual_tag", entity.getVirtualTag());
//        fieldValues.put("sourcepool_name", entity.getSourcepoolName());
        fieldValues.put("create_time", entity.getCreateTime());
        fieldValues.put("update_time", entity.getUpdateTime());
//        fieldValues.put("important", entity.getImportant());
//        fieldValues.put("network_keypoint", entity.getNetworkKeypoint());
//        fieldValues.put("subdivision_type", entity.getSubdivisionType());
//        fieldValues.put("manage_mode", entity.getManageMode());
//        fieldValues.put("usage", entity.getUsage());
//        fieldValues.put("manager_name", entity.getManagerName());
//        fieldValues.put("manager_mobile", entity.getManagerMobile());

        return generateDivisionAssetInsertSql(fieldValues);
    }


    public static void main(String[] args) {

        DivisionAssetInfo entity = new DivisionAssetInfo();
//        String sql = generateDivisionAssetInfoInsertSql(entity);
//        System.out.println("sql = " + sql);

   /*     // 1. 通用INSERT示例（division_asset_info表）
        Map<String, Object> assetFields = new HashMap<>();
        assetFields.put("rela_id", "REL12345");
        assetFields.put("group_asset_id", "GROUP001");
        assetFields.put("division_asset_id", "DIV001");
        assetFields.put("asset_name", "核心服务器");
        assetFields.put("asset_type", "01");
        assetFields.put("status", 1);
        assetFields.put("is_access", true);
        assetFields.put("net_position", 0);
        assetFields.put("create_time", LocalDateTime.now());
        assetFields.put("update_time", LocalDateTime.now());

        String insertSql = UniversalSqlGenerator.generateInsertSql("division_asset_info", assetFields);
        System.out.println(insertSql);

        // 2. 通用UPDATE示例（division_asset_info表）
        Map<String, Object> updateFields = new HashMap<>();
        updateFields.put("asset_name", "更新后的服务器名称");
        updateFields.put("status", 2);
        updateFields.put("update_time", LocalDateTime.now());

        String updateSql = UniversalSqlGenerator.generateUpdateSql(
                "division_asset_info",
                updateFields,
                "id = 123"
        );
        System.out.println(updateSql);

        // 3. 通用DELETE示例（division_asset_info表）
        String deleteSql = UniversalSqlGenerator.generateDeleteSql(
                "division_asset_info",
                "id = 123 AND status = 3"
        );
        System.out.println(deleteSql);

        // 4. 使用便捷方法（division_asset_info表）
        String assetInsertSql = UniversalSqlGenerator.generateDivisionAssetInsertSql(assetFields);
        System.out.println(assetInsertSql);

        // 5. 使用便捷方法（rank_log_asset_info_basis_web表）
        String rankLogUpdateSql = UniversalSqlGenerator.generateRankLogUpdateSql(
                "id1",
                "asset1",
                "2023-11-15 14:30:45"
        );
        System.out.println(rankLogUpdateSql);*/
    }


    // IPv4正则表达式
    private static final Pattern IPV4_PATTERN = Pattern.compile(
            "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
    );

    // IPv6正则表达式（简化版）
    private static final Pattern IPV6_PATTERN = Pattern.compile(
            "^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$"  // 标准格式
                    + "|^::([0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$"  // 开头缩写
                    + "|^([0-9a-fA-F]{1,4}:){1,7}:$"  // 结尾缩写
                    + "|^([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}$"  // 中间缩写
                    + "|^([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}$"  // 多处缩写
                    + "|^([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}$"
                    + "|^([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}$"
                    + "|^([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}$"
                    + "|^[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})$"  // 结尾多处缩写
                    + "|^:((:[0-9a-fA-F]{1,4}){1,7}|:)$"  // 全缩写
                    + "|^([0-9a-fA-F]{1,4}:){1,4}:([0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}$"  // 混合缩写
    );

    /**
     * 判断IP地址类型
     * @param ip IP地址字符串
     * @return 0=IPv4, 1=IPv6, null=无法识别
     */
    public static Integer determineIpType(String ip) {
        if (ip == null || ip.trim().isEmpty()) {
            return null;
        }

        // 去除可能的端口部分（如192.168.1.1:8080）
        String ipOnly = ip.split(":")[0];

        if (IPV4_PATTERN.matcher(ipOnly).matches()) {
            return 0; // IPv4
        } else if (IPV6_PATTERN.matcher(ipOnly).matches()) {
            return 1; // IPv6
        }

        return null; // 无法识别
    }


}